<?php
namespace action\admin;
use \cass\formulaire AS form;

class credentialsAction extends \cass\Action {

    /**
     * Méthode par défaut
     */
    public function init() {
        $this->forwardEven($this->getSession()->hasCredential('admin_credentials'), '@403');
        $this->addToAriane('class', 'access'); // Classe pour le titre
    }

    /**
     * Méthode de gestion des accès
     */
    public function execute() {
        // Infos de la page
        $this->setTitle('Gestion des accès');

        // Groupes de droits
        $this->groups = $this->doctrine->getRepository('Group')->findAll();
    }

    /**
     * Créé un profil
     */
    public function executeCreate() {
        // Infos de la page
        $this->setTitle('Création d\'un groupe');

        // Sélection des accès
        $credentials = $this->doctrine->getRepository('Credential')->findAll();

        // Formulaire de création de groupe
        $formulaire = new form\Formulaire('Création d\'un groupe');
        $formulaire->setButtons('submit', 'Ajouter le groupe');
        $formulaire->addToLinks('Retour à la gestion des accès', url_for('admin', 'credentials'));
        $multi = new form\Multi('Accès', null, false);
        foreach ($credentials AS $credential) {
            $multi->addToPossibleValues($credential->getId(), $credential->getName());
        }
        $formulaire->append(new form\Input('Nom du groupe', '', true, ''));
        $formulaire->append(new form\ColorPicker('Couleur', '', false, ''));
        $formulaire->append($multi);

        // Vérifications
        if ($formulaire->isPosted()) {
            // Sélection des profils qui ont ce nom
            if (!$formulaire->{'Nom du groupe'}->isError() AND ($this->doctrine->getRepository('Group')->findByName($formulaire->getValue('Nom du groupe')) != null)) {
                $formulaire->{'Nom du groupe'}->setError('Le nom du groupe existe déjà');
            }
        }

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            $groupe = new \Group;
            $groupe->setName($formulaire->getValue('Nom du groupe'));
            $groupe->setColor($formulaire->getValue('Couleur'));
            foreach ($formulaire->getValue('Accès') AS $access) {
                $groupe->addCredentials($this->doctrine->find('Credential', $access));
            }

            $this->doctrine->persist($groupe);
            $this->doctrine->flush();
            $formulaire->setConfirm('Le profil a été ajouté. Retournez à <a href="' . url_for('admin', 'credentials') . '">la gestion des accès</a>.');
        }

        // Assignations
        $this->formulaire = $formulaire;
    }

    /**
     * Modifie un profil
     * @param <integer> $_profil Id du profil à modifier
     */
    public function executeEdit($_group) {
        // Infos de la page
        $this->setTitle('Modification d\'un groupe');

        // Sélection des accès
        $group = $this->doctrine->find('Group', $_group);
        $credentials = $this->doctrine->getRepository('Credential')->findAll();
        $profilCredentials = array();
        foreach ($group->getCredentials() AS $credential) {
            $profilCredentials[] = $credential->getId();
        }
        $formulaire = new form\Formulaire('Modification d\'un groupe');
        $formulaire->setButtons('submit', 'Modifier le groupe');
        $formulaire->addToLinks('Retour à la gestion des accès', url_for('admin', 'credentials'));
        $multi = new form\Multi('Accès', $profilCredentials, false);
        foreach ($credentials AS $credential) {
            $multi->addToPossibleValues($credential->getId(), $credential->getName());
        }
        $formulaire->append(new form\Input('Nom du groupe', $group->getName(), true));
        $formulaire->append(new form\ColorPicker('Couleur', $group->getColor(), false));
        $formulaire->append($multi);

        // Vérifications
        if ($formulaire->isPosted()) {
            // Sélection des profils qui ont ce nom
            if (!$formulaire->{'Nom du groupe'}->isError() AND
                    ($formulaire->getValue('Nom du groupe') != $group->getName()) AND
                    ($this->doctrine->getRepository('Group')->findByName($formulaire->getValue('Nom du profil')) != null)) {
                $formulaire->{'Nom du profil'}->setError('Le nom du profil existe déjà');
            }
        }

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            $group->setName($formulaire->getValue('Nom du groupe'));
            $group->setColor($formulaire->getValue('Couleur'));
            $group->getCredentials()->clear();
            foreach ($formulaire->getValue('Accès') AS $access) {
                $group->addCredentials($this->doctrine->find('Credential', $access));
            }
            $this->doctrine->flush();
            $formulaire->setConfirm('Le groupe a été modifié. Retournez à <a href="' . url_for('admin', 'credentials') . '">la gestion des accès</a>.');
        }

        // Assignations
        $this->formulaire = $formulaire;
    }

    /**
     * Supprime un profil et les droits d'un user associé au profil
     * @param <integer> $_profil Id du profil à supprimer
     */
    public function executeDelete($_group) {
        // Infos de la page
        $this->setTitle('Suppression d\'un groupe');

        // Sélection du profil
        $group = $this->doctrine->find('Group', $_group);

        // Formulaire de confirmation de suppresion du groupe
        $formulaire = new form\Formulaire('Suppression d\'un groupe');
        $formulaire->setButtons('submit', 'Supprimer le groupe');
        $formulaire->addToLinks('Retour à la gestion des accès', url_for('admin', 'credentials'));
        $formulaire->append(new form\Text('Confirmez vous la suppression du groupe ' . $group->getName() . ' ?<br />Les utilisateurs associés à ce profil perdront les droits associés.'));

        // Vérifications
        if ($formulaire->isPosted()) {

        }

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            $this->doctrine->remove($group);
            $this->doctrine->flush();
            $formulaire->setConfirm('Le groupe a été supprimé. Retournez à <a href="' . url_for('admin', 'credentials') . '">la gestion des accès</a>.');
        }

        // Assignations
        $this->formulaire = $formulaire;
    }

    /**
     * Supprime plusieurs groupes
     */
    public function executeMulti() {
        // Formulaire de suppression multiple
        $formulaire = new form\Formulaire('Action multiple');
        $formulaire->append(new form\Multi('Éléments', array(), '', false));
        $select = new form\Select('action');
        $select->addToPossibleValues('delete', 'Supprimer les éléments sélectionnés');
        $formulaire->append($select);

        // Vérifications
        if ($formulaire->isPosted()) {

        }

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            $profils = array_keys($formulaire->getValue('Éléménts'));
            foreach ($profils AS $profil) {
                $group = $this->doctrine->find('Group', $profil);
                $this->doctrine->remove($group);
            }
            $this->doctrine->flush();
            $this->redirect('admin', 'credentials');
        }

        // Assignations
        $this->formulaire = $formulaire;
    }

}